library(dplyr)
library(tidyr)
library(ggplot2)
library(plotly)
if(!exists("all_gather02")){
all_gather02<-readRDS("data/tasas_diarias_x_region_02.rds")
}
all_gather02%>%
mutate(
mesdia=round(mesdia,2)
)
Nacionales
vartmp<-"cifras"
gg00<-ggplot(all_gather02%>%
select(-TOTALES,-starts_with("tasa_"),-starts_with("gap_"))%>%
filter(Region%in%c("Nacional"))%>%
# filter_(.dots = paste0(vartmp," > 0"))%>%#paste0(vartmp,"!=-99"))%>%
mutate(
mesdia=as.factor(as.character.numeric_version(round(mesdia,2))),
Region=as.factor(Region)
)%>%
gather(metrica,cifras,-Region,-mesdia)%>%
filter_(.dots = paste0(vartmp," >= 0")),#paste0(vartmp,"!=-99")),
aes(x=mesdia,colour=metrica,group=1))
ggplotly(
gg00 +
geom_line(aes_string(y=vartmp)) +
theme(axis.text.x = element_text(angle = 90, hjust = 1))+
labs(title = "Métricas Nacionales por día")
)
vartmp_x<-"ConfirmadosEstimados"
vartmp<-"cifras"
gg00<-ggplot(all_gather02%>%
select(-TOTALES,-starts_with("tasa_"),-starts_with("gap_"))%>%
filter(Region%in%c("Nacional"))%>%
# filter_(.dots = paste0(vartmp," > 0"))%>%#paste0(vartmp,"!=-99"))%>%
mutate(
mesdia=as.factor(as.character.numeric_version(round(mesdia,2))),
Region=as.factor(Region)
)%>%
gather(metrica,cifras,-one_of(c("Region","mesdia",vartmp_x)))%>%
filter_(.dots = paste0(vartmp," >= 0")),#paste0(vartmp,"!=-99")),
aes(colour=metrica,group=1))
ggplotly(
gg00 +
geom_point(aes_string(x=vartmp_x,y=vartmp)) +
theme(axis.text.x = element_text(angle = 90, hjust = 1))+
labs(title = "Confirmados (estimados) vs las otras Métricas Nacionales")
)
Por Región
Confirmados vs Hospitalizados, Recuperados, Cuidados Intensivos, Fallecidos
vartmp_x<-"ConfirmadosEstimados"
vartmp<-"cifras"
gg00<-ggplot(all_gather02%>%
select(-TOTALES,-starts_with("tasa_"),-starts_with("gap_"))%>%
filter(!Region%in%c("Nacional"))%>%
# filter_(.dots = paste0(vartmp," > 0"))%>%#paste0(vartmp,"!=-99"))%>%
mutate(
mesdia=as.factor(as.character.numeric_version(round(mesdia,2))),
Region=as.factor(Region)
)%>%
gather(metrica,cifras,-one_of(c("Region","mesdia",vartmp_x)))%>%
filter_(.dots = paste0(vartmp," >= 0")),#paste0(vartmp,"!=-99")),
aes(colour=metrica,group=1)) +
facet_wrap(~Region,scales = "free",nrow = 4) +
theme(strip.background = element_blank(), strip.placement = "outside")
# print(
ggplotly(
gg00 +
geom_point(aes_string(x=vartmp_x,y=vartmp)) +
theme_void() + theme(legend.position="none")+
labs(title = "Confirmados (estimados) vs las otras Métricas por Región")
# theme(axis.text.x = element_text(angle = 90, hjust = 1))
)
# )
Confirmados por dìa & por Región
vartmp<-"ConfirmadosEstimados"
gg00<-ggplot(all_gather02%>%
filter(!Region%in%c("Nacional"))%>%
filter_(.dots = paste0(vartmp," > 0"))%>%#paste0(vartmp,"!=-99"))%>%
mutate(
mesdia=as.factor(as.character.numeric_version(round(mesdia,2))),
Region=as.factor(Region)
), aes(x=mesdia,colour=Region,group=1))
ggplotly(
gg00 +
geom_line(aes_string(y=vartmp)) +
theme(axis.text.x = element_text(angle = 90, hjust = 1))+
labs(title = paste0(vartmp," por día & por Región"))
)
Hospitalizados por dìa & por Región
vartmp<-"Hospitalizados"
gg00<-ggplot(all_gather02%>%
filter(!Region%in%c("Nacional"))%>%
filter_(.dots = paste0(vartmp," > 0"))%>%#paste0(vartmp,"!=-99"))%>%
mutate(
mesdia=as.factor(as.character.numeric_version(round(mesdia,2))),
Region=as.factor(Region)
), aes(x=mesdia,colour=Region,group=1))
ggplotly(
gg00 +
geom_line(aes_string(y=vartmp)) +
theme(axis.text.x = element_text(angle = 90, hjust = 1))+
labs(title = paste0(vartmp," por día & por Región"))
)
Recuperados por dìa & por Región
vartmp<-"Recuperados"
gg00<-ggplot(all_gather02%>%
filter(!Region%in%c("Nacional"))%>%
filter_(.dots = paste0(vartmp," > 0"))%>%#paste0(vartmp,"!=-99"))%>%
mutate(
mesdia=as.factor(as.character.numeric_version(round(mesdia,2))),
Region=as.factor(Region)
), aes(x=mesdia,colour=Region,group=1))
ggplotly(
gg00 +
geom_line(aes_string(y=vartmp)) +
theme(axis.text.x = element_text(angle = 90, hjust = 1))+
labs(title = paste0(vartmp," por día & por Región"))
)
Cuidados Intensivos por dìa & por Región
vartmp<-"CuidadosIntensivos"
gg00<-ggplot(all_gather02%>%
filter(!Region%in%c("Nacional"))%>%
filter_(.dots = paste0(vartmp," > 0"))%>%#paste0(vartmp,"!=-99"))%>%
mutate(
mesdia=as.factor(as.character.numeric_version(round(mesdia,2))),
Region=as.factor(Region)
), aes(x=mesdia,colour=Region,group=1))
ggplotly(
gg00 +
geom_line(aes_string(y=vartmp)) +
theme(axis.text.x = element_text(angle = 90, hjust = 1))+
labs(title = paste0(vartmp," por día & por Región"))
)
Fallecidos por dìa & por Región
vartmp<-"Fallecidos"
gg00<-ggplot(all_gather02%>%
filter(!Region%in%c("Nacional"))%>%
filter_(.dots = paste0(vartmp," > 0"))%>%#paste0(vartmp,"!=-99"))%>%
mutate(
mesdia=as.factor(as.character.numeric_version(round(mesdia,2))),
Region=as.factor(Region)
), aes(x=mesdia,colour=Region,group=1))
ggplotly(
gg00 +
geom_line(aes_string(y=vartmp)) +
theme(axis.text.x = element_text(angle = 90, hjust = 1))+
labs(title = paste0(vartmp," por día & por Región"))
)
LS0tCnRpdGxlOiAiRURBIC0gMDIiCnN1YnRpdGxlOiAiR3LDoWZpY2FzIDFlcmEgUGFydGU6IEFic29sdXRvcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbG90bHkpCmBgYAoKYGBge3J9CmlmKCFleGlzdHMoImFsbF9nYXRoZXIwMiIpKXsKICBhbGxfZ2F0aGVyMDI8LXJlYWRSRFMoImRhdGEvdGFzYXNfZGlhcmlhc194X3JlZ2lvbl8wMi5yZHMiKQp9CmFsbF9nYXRoZXIwMiU+JQogIG11dGF0ZSgKICAgIG1lc2RpYT1yb3VuZChtZXNkaWEsMikKICApCmBgYAoKIyBOYWNpb25hbGVzCgpgYGB7cixmaWcud2lkdGg9MTAsZmlnLmhlaWdodD03LGZpZy5hbGlnbj0nbGVmdCd9CnZhcnRtcDwtImNpZnJhcyIKZ2cwMDwtZ2dwbG90KGFsbF9nYXRoZXIwMiU+JQogICAgICAgICAgICAgICBzZWxlY3QoLVRPVEFMRVMsLXN0YXJ0c193aXRoKCJ0YXNhXyIpLC1zdGFydHNfd2l0aCgiZ2FwXyIpKSU+JQogICAgICAgICAgICAgICBmaWx0ZXIoUmVnaW9uJWluJWMoIk5hY2lvbmFsIikpJT4lCiAgICAgICAgICAgICAgICMgZmlsdGVyXyguZG90cyA9IHBhc3RlMCh2YXJ0bXAsIiA+IDAiKSklPiUjcGFzdGUwKHZhcnRtcCwiIT0tOTkiKSklPiUKICAgICAgICAgICAgICAgbXV0YXRlKAogICAgICAgICAgICAgICAgIG1lc2RpYT1hcy5mYWN0b3IoYXMuY2hhcmFjdGVyLm51bWVyaWNfdmVyc2lvbihyb3VuZChtZXNkaWEsMikpKSwKICAgICAgICAgICAgICAgICBSZWdpb249YXMuZmFjdG9yKFJlZ2lvbikKICAgICAgICAgICAgICAgKSU+JQogICAgICAgICAgICAgICBnYXRoZXIobWV0cmljYSxjaWZyYXMsLVJlZ2lvbiwtbWVzZGlhKSU+JQogICAgICAgICAgICAgICBmaWx0ZXJfKC5kb3RzID0gcGFzdGUwKHZhcnRtcCwiID49IDAiKSksI3Bhc3RlMCh2YXJ0bXAsIiE9LTk5IikpLCAKICAgICAgICAgICAgIGFlcyh4PW1lc2RpYSxjb2xvdXI9bWV0cmljYSxncm91cD0xKSkKCmdncGxvdGx5KAogICAgZ2cwMCArCiAgICAgIGdlb21fbGluZShhZXNfc3RyaW5nKHk9dmFydG1wKSkgKyAKICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkrCiAgICAgIGxhYnModGl0bGUgPSAiTcOpdHJpY2FzIE5hY2lvbmFsZXMgcG9yIGTDrWEiKQopCmBgYAoKCgpgYGB7cixmaWcud2lkdGg9MTAsZmlnLmhlaWdodD03LGZpZy5hbGlnbj0nbGVmdCd9CnZhcnRtcF94PC0iQ29uZmlybWFkb3NFc3RpbWFkb3MiCnZhcnRtcDwtImNpZnJhcyIKZ2cwMDwtZ2dwbG90KGFsbF9nYXRoZXIwMiU+JQogICAgICAgICAgICAgICBzZWxlY3QoLVRPVEFMRVMsLXN0YXJ0c193aXRoKCJ0YXNhXyIpLC1zdGFydHNfd2l0aCgiZ2FwXyIpKSU+JQogICAgICAgICAgICAgICBmaWx0ZXIoUmVnaW9uJWluJWMoIk5hY2lvbmFsIikpJT4lCiAgICAgICAgICAgICAgICMgZmlsdGVyXyguZG90cyA9IHBhc3RlMCh2YXJ0bXAsIiA+IDAiKSklPiUjcGFzdGUwKHZhcnRtcCwiIT0tOTkiKSklPiUKICAgICAgICAgICAgICAgbXV0YXRlKAogICAgICAgICAgICAgICAgIG1lc2RpYT1hcy5mYWN0b3IoYXMuY2hhcmFjdGVyLm51bWVyaWNfdmVyc2lvbihyb3VuZChtZXNkaWEsMikpKSwKICAgICAgICAgICAgICAgICBSZWdpb249YXMuZmFjdG9yKFJlZ2lvbikKICAgICAgICAgICAgICAgKSU+JQogICAgICAgICAgICAgICBnYXRoZXIobWV0cmljYSxjaWZyYXMsLW9uZV9vZihjKCJSZWdpb24iLCJtZXNkaWEiLHZhcnRtcF94KSkpJT4lCiAgICAgICAgICAgICAgIGZpbHRlcl8oLmRvdHMgPSBwYXN0ZTAodmFydG1wLCIgPj0gMCIpKSwjcGFzdGUwKHZhcnRtcCwiIT0tOTkiKSksIAogICAgICAgICAgICAgYWVzKGNvbG91cj1tZXRyaWNhLGdyb3VwPTEpKQoKZ2dwbG90bHkoCiAgICBnZzAwICsKICAgICAgZ2VvbV9wb2ludChhZXNfc3RyaW5nKHg9dmFydG1wX3gseT12YXJ0bXApKSArIAogICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSsKICAgICAgbGFicyh0aXRsZSA9ICJDb25maXJtYWRvcyAoZXN0aW1hZG9zKSB2cyBsYXMgb3RyYXMgTcOpdHJpY2FzIE5hY2lvbmFsZXMiKQopCmBgYAoKIyBQb3IgUmVnacOzbiB7LnRhYnNldH0KCiMjIENvbmZpcm1hZG9zIHZzIEhvc3BpdGFsaXphZG9zLCBSZWN1cGVyYWRvcywgQ3VpZGFkb3MgSW50ZW5zaXZvcywgRmFsbGVjaWRvcwpgYGB7cixmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0xMCxmaWcuYWxpZ249J2xlZnQnfQp2YXJ0bXBfeDwtIkNvbmZpcm1hZG9zRXN0aW1hZG9zIgp2YXJ0bXA8LSJjaWZyYXMiCmdnMDA8LWdncGxvdChhbGxfZ2F0aGVyMDIlPiUKICAgICAgICAgICAgICAgc2VsZWN0KC1UT1RBTEVTLC1zdGFydHNfd2l0aCgidGFzYV8iKSwtc3RhcnRzX3dpdGgoImdhcF8iKSklPiUKICAgICAgICAgICAgICAgZmlsdGVyKCFSZWdpb24laW4lYygiTmFjaW9uYWwiKSklPiUKICAgICAgICAgICAgICAgIyBmaWx0ZXJfKC5kb3RzID0gcGFzdGUwKHZhcnRtcCwiID4gMCIpKSU+JSNwYXN0ZTAodmFydG1wLCIhPS05OSIpKSU+JQogICAgICAgICAgICAgICBtdXRhdGUoCiAgICAgICAgICAgICAgICAgbWVzZGlhPWFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIubnVtZXJpY192ZXJzaW9uKHJvdW5kKG1lc2RpYSwyKSkpLAogICAgICAgICAgICAgICAgIFJlZ2lvbj1hcy5mYWN0b3IoUmVnaW9uKQogICAgICAgICAgICAgICApJT4lCiAgICAgICAgICAgICAgIGdhdGhlcihtZXRyaWNhLGNpZnJhcywtb25lX29mKGMoIlJlZ2lvbiIsIm1lc2RpYSIsdmFydG1wX3gpKSklPiUKICAgICAgICAgICAgICAgZmlsdGVyXyguZG90cyA9IHBhc3RlMCh2YXJ0bXAsIiA+PSAwIikpLCNwYXN0ZTAodmFydG1wLCIhPS05OSIpKSwgCiAgICAgICAgICAgICBhZXMoY29sb3VyPW1ldHJpY2EsZ3JvdXA9MSkpICsKICBmYWNldF93cmFwKH5SZWdpb24sc2NhbGVzID0gImZyZWUiLG5yb3cgPSA0KSArCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgc3RyaXAucGxhY2VtZW50ID0gIm91dHNpZGUiKQojIHByaW50KApnZ3Bsb3RseSgKICAgIGdnMDAgKwogICAgICBnZW9tX3BvaW50KGFlc19zdHJpbmcoeD12YXJ0bXBfeCx5PXZhcnRtcCkpICsgCiAgICAgIHRoZW1lX3ZvaWQoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogICAgICBsYWJzKHRpdGxlID0gIkNvbmZpcm1hZG9zIChlc3RpbWFkb3MpIHZzIGxhcyBvdHJhcyBNw6l0cmljYXMgcG9yIFJlZ2nDs24iKQogICAgICAjIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCikKIyApCmBgYAoKIyMgQ29uZmlybWFkb3MgcG9yIGTDrGEgJiBwb3IgUmVnacOzbiAKYGBge3IsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9NyxmaWcuYWxpZ249J2xlZnQnfQp2YXJ0bXA8LSJDb25maXJtYWRvc0VzdGltYWRvcyIKZ2cwMDwtZ2dwbG90KGFsbF9nYXRoZXIwMiU+JQogICAgICAgICAgICAgICBmaWx0ZXIoIVJlZ2lvbiVpbiVjKCJOYWNpb25hbCIpKSU+JQogICAgICAgICAgICAgICBmaWx0ZXJfKC5kb3RzID0gcGFzdGUwKHZhcnRtcCwiID4gMCIpKSU+JSNwYXN0ZTAodmFydG1wLCIhPS05OSIpKSU+JQogICAgICAgICAgICAgICBtdXRhdGUoCiAgICAgICAgICAgICAgICAgbWVzZGlhPWFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIubnVtZXJpY192ZXJzaW9uKHJvdW5kKG1lc2RpYSwyKSkpLAogICAgICAgICAgICAgICAgIFJlZ2lvbj1hcy5mYWN0b3IoUmVnaW9uKQogICAgICAgICAgICAgICApLCBhZXMoeD1tZXNkaWEsY29sb3VyPVJlZ2lvbixncm91cD0xKSkKCmdncGxvdGx5KAogICAgZ2cwMCArCiAgICAgIGdlb21fbGluZShhZXNfc3RyaW5nKHk9dmFydG1wKSkgKyAKICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkrCiAgICAgIGxhYnModGl0bGUgPSBwYXN0ZTAodmFydG1wLCIgcG9yIGTDrWEgJiBwb3IgUmVnacOzbiIpKQopCmBgYAoKCiMjIEhvc3BpdGFsaXphZG9zIHBvciBkw6xhICYgcG9yIFJlZ2nDs24gCmBgYHtyLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTcsZmlnLmFsaWduPSdsZWZ0J30KdmFydG1wPC0iSG9zcGl0YWxpemFkb3MiCmdnMDA8LWdncGxvdChhbGxfZ2F0aGVyMDIlPiUKICAgICAgICAgICAgICAgZmlsdGVyKCFSZWdpb24laW4lYygiTmFjaW9uYWwiKSklPiUKICAgICAgICAgICAgICAgZmlsdGVyXyguZG90cyA9IHBhc3RlMCh2YXJ0bXAsIiA+IDAiKSklPiUjcGFzdGUwKHZhcnRtcCwiIT0tOTkiKSklPiUKICAgICAgICAgICAgICAgbXV0YXRlKAogICAgICAgICAgICAgICAgIG1lc2RpYT1hcy5mYWN0b3IoYXMuY2hhcmFjdGVyLm51bWVyaWNfdmVyc2lvbihyb3VuZChtZXNkaWEsMikpKSwKICAgICAgICAgICAgICAgICBSZWdpb249YXMuZmFjdG9yKFJlZ2lvbikKICAgICAgICAgICAgICAgKSwgYWVzKHg9bWVzZGlhLGNvbG91cj1SZWdpb24sZ3JvdXA9MSkpCgpnZ3Bsb3RseSgKICAgIGdnMDAgKwogICAgICBnZW9tX2xpbmUoYWVzX3N0cmluZyh5PXZhcnRtcCkpICsgCiAgICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpKwogICAgICBsYWJzKHRpdGxlID0gcGFzdGUwKHZhcnRtcCwiIHBvciBkw61hICYgcG9yIFJlZ2nDs24iKSkKKQpgYGAKCgoKIyMgUmVjdXBlcmFkb3MgcG9yIGTDrGEgJiBwb3IgUmVnacOzbgpgYGB7cixmaWcud2lkdGg9MTAsZmlnLmhlaWdodD03LGZpZy5hbGlnbj0nbGVmdCd9CnZhcnRtcDwtIlJlY3VwZXJhZG9zIgpnZzAwPC1nZ3Bsb3QoYWxsX2dhdGhlcjAyJT4lCiAgICAgICAgICAgICAgIGZpbHRlcighUmVnaW9uJWluJWMoIk5hY2lvbmFsIikpJT4lCiAgICAgICAgICAgICAgIGZpbHRlcl8oLmRvdHMgPSBwYXN0ZTAodmFydG1wLCIgPiAwIikpJT4lI3Bhc3RlMCh2YXJ0bXAsIiE9LTk5IikpJT4lCiAgICAgICAgICAgICAgIG11dGF0ZSgKICAgICAgICAgICAgICAgICBtZXNkaWE9YXMuZmFjdG9yKGFzLmNoYXJhY3Rlci5udW1lcmljX3ZlcnNpb24ocm91bmQobWVzZGlhLDIpKSksCiAgICAgICAgICAgICAgICAgUmVnaW9uPWFzLmZhY3RvcihSZWdpb24pCiAgICAgICAgICAgICAgICksIGFlcyh4PW1lc2RpYSxjb2xvdXI9UmVnaW9uLGdyb3VwPTEpKQoKZ2dwbG90bHkoCiAgICBnZzAwICsKICAgICAgZ2VvbV9saW5lKGFlc19zdHJpbmcoeT12YXJ0bXApKSArIAogICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSsKICAgICAgbGFicyh0aXRsZSA9IHBhc3RlMCh2YXJ0bXAsIiBwb3IgZMOtYSAmIHBvciBSZWdpw7NuIikpCikKYGBgCgoKIyMgQ3VpZGFkb3MgSW50ZW5zaXZvcyBwb3IgZMOsYSAmIHBvciBSZWdpw7NuCmBgYHtyLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTcsZmlnLmFsaWduPSdsZWZ0J30KdmFydG1wPC0iQ3VpZGFkb3NJbnRlbnNpdm9zIgpnZzAwPC1nZ3Bsb3QoYWxsX2dhdGhlcjAyJT4lCiAgICAgICAgICAgICAgIGZpbHRlcighUmVnaW9uJWluJWMoIk5hY2lvbmFsIikpJT4lCiAgICAgICAgICAgICAgIGZpbHRlcl8oLmRvdHMgPSBwYXN0ZTAodmFydG1wLCIgPiAwIikpJT4lI3Bhc3RlMCh2YXJ0bXAsIiE9LTk5IikpJT4lCiAgICAgICAgICAgICAgIG11dGF0ZSgKICAgICAgICAgICAgICAgICBtZXNkaWE9YXMuZmFjdG9yKGFzLmNoYXJhY3Rlci5udW1lcmljX3ZlcnNpb24ocm91bmQobWVzZGlhLDIpKSksCiAgICAgICAgICAgICAgICAgUmVnaW9uPWFzLmZhY3RvcihSZWdpb24pCiAgICAgICAgICAgICAgICksIGFlcyh4PW1lc2RpYSxjb2xvdXI9UmVnaW9uLGdyb3VwPTEpKQoKZ2dwbG90bHkoCiAgICBnZzAwICsKICAgICAgZ2VvbV9saW5lKGFlc19zdHJpbmcoeT12YXJ0bXApKSArIAogICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSsKICAgICAgbGFicyh0aXRsZSA9IHBhc3RlMCh2YXJ0bXAsIiBwb3IgZMOtYSAmIHBvciBSZWdpw7NuIikpCikKYGBgCgojIyBGYWxsZWNpZG9zIHBvciBkw6xhICYgcG9yIFJlZ2nDs24KYGBge3IsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9NyxmaWcuYWxpZ249J2xlZnQnfQp2YXJ0bXA8LSJGYWxsZWNpZG9zIgpnZzAwPC1nZ3Bsb3QoYWxsX2dhdGhlcjAyJT4lCiAgICAgICAgICAgICAgIGZpbHRlcighUmVnaW9uJWluJWMoIk5hY2lvbmFsIikpJT4lCiAgICAgICAgICAgICAgIGZpbHRlcl8oLmRvdHMgPSBwYXN0ZTAodmFydG1wLCIgPiAwIikpJT4lI3Bhc3RlMCh2YXJ0bXAsIiE9LTk5IikpJT4lCiAgICAgICAgICAgICAgIG11dGF0ZSgKICAgICAgICAgICAgICAgICBtZXNkaWE9YXMuZmFjdG9yKGFzLmNoYXJhY3Rlci5udW1lcmljX3ZlcnNpb24ocm91bmQobWVzZGlhLDIpKSksCiAgICAgICAgICAgICAgICAgUmVnaW9uPWFzLmZhY3RvcihSZWdpb24pCiAgICAgICAgICAgICAgICksIGFlcyh4PW1lc2RpYSxjb2xvdXI9UmVnaW9uLGdyb3VwPTEpKQoKZ2dwbG90bHkoCiAgICBnZzAwICsKICAgICAgZ2VvbV9saW5lKGFlc19zdHJpbmcoeT12YXJ0bXApKSArIAogICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSsKICAgICAgbGFicyh0aXRsZSA9IHBhc3RlMCh2YXJ0bXAsIiBwb3IgZMOtYSAmIHBvciBSZWdpw7NuIikpCikKYGBgCg==